 ۲ ۲     
۲ ۲ ߲        
 ۲ ۲ ۲  
 ۲    ۲۲ ۲
          ۲ 
۲ ۲ ۲   ۲۲   ۲   ۲
  ۲۲ ۲ ۲
۲               
 aDVANCED aRT oF cRACKING gROUP    _sK!
  
presents: Tutorial by noname

 COOKIECRK TRIAL CRACKME       (c) noname/AAOCG

Where: www.cookiecrk.z.pl

Czesc,
dzisiaj zajmiemy sie CrackME polskiej grupy crack "CookieCrk". Zlamanie
tego CrackME pozwala na dolaczenie sie do nich na okres probny...

Potrzebne beda: SoftICE,
                WDasm,
                edytor hex (np. HIEW),
                kompilator oraz linker assemblera (np. TASM i TLINK)

Zaczynamy!


1. ANTY-SoftICE TRICK

Napewno zauwazyles, ze crackme nie uruchamia sie jesli jest zaladowany
SoftICE'em. Skoro tak to zdeassembluj program uzywajac WDasm (program
nie zawiera zadnych zabezpieczen przeciwko deassemblerom) - potrwa
to najwyzej kilka sekund. Poniewaz program nawet przez chwile nie poka-
zuje sie na pasku zadan, zabezpieczenie anty-SoftICE musi znajdowac sie
na poczatku. Poczatek wyglada nastepujaco:

:00401000  892515204000        MOV       [00402015],ESP
:00401006  6825104000          PUSH      00401025
:0040100B  E882060000          CALL      KERNEL32!SetUnhandledExceptionFilter
:00401010  BD4B484342          MOV       EBP,4243484B
:00401015  B804000000          MOV       EAX,00000004
:0040101A  CC                  INT       3
:0040101B  6A00                PUSH      00
:0040101D  E864060000          CALL      KERNEL32!ExitProcess
:00401022  EBF7                JMP       0040101B
:00401024  12E8                ADC       CH,AL
:00401026  050600006A          ADD       EAX,6A000006
:0040102B  00E8                ADD       AL,CH
:0040102D  55                  PUSH      EBP
:0040102E  06                  PUSH      ES
:0040102F  0000                ADD       [EAX],AL

W opisie funkcji SetUnhandledExceptionFiler jest napisane, ze jezeli wyjatek
obslugiwany przez filtr wystapi w *niedebugowanym* procesie proces wywola
funkcje podana jako parametr SetUnhandledExceptionFilter.

Najprostsza metoda to zmienienie pierwszej lub drugiej instrukcju na skok
pod adresm, ktory jest podany jako parametr funkcji, czyli 00401025.


2. NAG-SCREEN

OK, teraz CrackME sie juz uruchamia. Zajmijmy sie NAG-SCREENEM: Pokazanie
okna to prawie napewno funkcja ShowWindow. Zakladamy wiec pulapke na ShowWindow
i uruchamiamy program. SoftICE wyskakuje dokladnie w momencie pokazwyania NAGA.
Spisujemy offsety i znajdujemy to samo miejsce w WDasmie. Kilka linijek wyzej
mamy piekny napis: "Referenced by a CALL at Addresses:" i dwa adresy. Nie bedziemy
patchowac programu w dwoch miejscach, wystarczy, ze na poczatku procedury wyswie-
tlajacej NAGA umiescimy instrukcje RET (opcode: C3).


3. NUMER ODBLOKOWUJACY

Zalozmy pulapke na GetWindowTextA - nie ma reakcji. Zalozmy na GetDlgItemTextA
- pojawilo sie okienko z informacja o zlym numerze. Zaraz, zaraz nie badzmy
naiwni - skad program wie, ze jest zly numer skoro nie wywolal funkcji do pobie-
rania tekstu (SoftICE sie przeciez nie pojawil)? Gdy zastawiamy pulapke na
jakas funkcje SoftICE w miejscu pierwszego bajtu tej funkcji wpisuje instrunkcje
INT 3 (opcode: CC). Znajdzmy, w ktorym miejscu CrackME sprawdza, czy nie zostala
zalozona pulapka na GetDlgItemTextA. Poniewaz listing jest maly poszukajmy poprostu
tekstu ", CC" (bedzie to moglo byc np. "mov al, CC", albo "cmp [xxxx], CC").
Mamy szczescie - taki tekst znajduje sie tylko w jednym miejscu. Dla pewnosci
sprawdz jeszcze gdzie prowadzi skok nizej. Juz jestes pewien ? - w miejsce instrukcji
skoku wpisz NOPy, lub instrukcje RET. 

Teraz pulapka juz dziala. Wejdz do pierwszego CALLa napotkanego po drugim wywolaniu
pulapki. Sa tam otwierane VXD SoftICE'a - nazwy ich sa rozszyfrowywane z ciagow liter.
Znajdz pod edytorem hex te znaki i zamien je na cos innego...

Nastepny CALL zamienia wpisany kod na liczbe i umieszcza ja w EAX.
Nastepny juz liczenie numeru z imienia:
 
:004012F7  33C9                XOR       ECX,ECX
:004012F9  35ADDEADDE          XOR       EAX,DEADDEAD        ; w EAX jest nasz kod
:004012FE  C1C807              ROR       EAX,07
:00401301  48                  DEC       EAX
:00401302  C1C003              ROL       EAX,03
:00401305  8B1F                MOV       EBX,[EDI]           ; w [EDI] znajduje sie imie
:00401307  F7D3                NOT       EBX                 ; wiec w EBX beda 4 pierwsze znaki
:00401309  32FB                XOR       BH,BL               ; ale od tylu
:0040130B  C1C303              ROL       EBX,03
:0040130E  43                  INC       EBX
:0040130F  C1CB07              ROR       EBX,07
:00401312  031F                ADD       EBX,[EDI]           ; w [EDI] jest imie
:00401314  83C704              ADD       EDI,04              ; nastepne 4 znaki
:00401317  03CB                ADD       ECX,EBX             ; do ECX dodajemy wyniki kolejnych
:00401319  803F00              CMP       BYTE PTR [EDI],00   ; obliczen
:0040131C  7402                JZ        00401320            ; powtarzaj dopuki nie skoncza sie
:0040131E  EBE5                JMP       00401305            ; znaki
:00401320  03D9                ADD       EBX,ECX             ; dodaj do ostatniego wyniku wszystkie
:00401322  03C3                ADD       EAX,EBX             ; wyniki, dodaj EAX i odejmij 12121212.
:00401324  2D12121212          SUB       EAX,12121212
:00401329  7404                JZ        0040132F            ; w wyniku ma wysjc zero
:0040132B  33C0                XOR       EAX,EAX
:0040132D  EB05                JMP       00401334
:0040132F  B801000000          MOV       EAX,00000001
:00401334  C3                  RET

Ze wzgledu na dodawania, ktore moga wyjsc poza rozmiar 32-bitowego rejestru, nie da sie
tej procedury odwrocic. Jedyna metoda to BRUTE FORCE! To jest moj "keymaker":


;------------------------------- tu ciac -----------------------------------
.model tiny
.386
.code
org 100h


start:

 inc dword ptr [guess]
 cmp dword ptr [guess], 0ffffffffh
 je exit

 mov eax, [guess]
 xor eax, 0deaddeadh
 ror eax, 7
 dec eax
 rol eax, 3

 lea edi, string
 xor ecx, ecx

 calcloop:
  mov ebx, dword ptr [edi]
  not ebx
  xor bh, bl
  rol ebx, 3
  inc ebx
  ror ebx, 7
  add ebx, dword ptr [edi]
  add ecx, ebx
  add edi, 4
  cmp byte ptr [edi], 0
 jne calcloop
 add ebx, ecx
 add eax, ebx
 sub eax, 12121212h

 jnz start 

  lea esi, guess
  int 3

exit:

ret

guess DD 0
string DB 'noname/AAOCG',0
end start
;------------------------------- tu ciac -----------------------------------

Jest wolny i nie wyswietla wyniku na ekranie (musi byc aktywny SoftICE i
I3HERE ustawione na ON - wynik pokaze sie po wpisaniu "D ESI"), ale dziala
 - uruchom go, i poczekaj kilka godzin :-).
Nastepne instrukcje sprawdzaja czy numer ma 10 znakow - jesli program zna-
lazl numer mniejszy do miliarda, dopisz z przodu zera...


4. KEY-FILE

Zaloz pulapke na CreateFileA i uruchom program. Wcisnij F12 aby dostac sie
do kodu CrackME. Pierwszy parametr (czyli ostatni PUSH) funkcji CreateFileA
to nazwa pliku. Zobacz, co program doklada na stosie tuz przed wywolaniem
funkcji - jest to wlasnie nazwa pliku - "crackme.key". Pozniej nastepuje
czytanie z pliku (ReadFile) i jesli wszystko pojdzie pomyslnie dojdziemy
do takiego kodu:

:004013A7  B8B8234000          MOV       EAX,004023B8      ; adres zawartosci pliku
:004013AC  8B38                MOV       EDI,[EAX]         ; do EDI pierwsze 4 znaki
:004013AE  C1EF05              SHR       EDI,05
:004013B1  81F7780AE305        XOR       EDI,05E30A78
:004013B7  0FAF38              IMUL      EDI,[EAX]
:004013BA  C1E703              SHL       EDI,03
:004013BD  83C008              ADD       EAX,08
:004013C0  81F7083AC2E5        XOR       EDI,E5C23A08
:004013C6  0F859A000000        JNZ       00401466          ; jesli nie jest 0 to koniec

Procedury nie da sie odwrocic - mnozenie napewno przekracza poza 32-bitowa liczbe;
pozostaje BRUTE FORCE! (Tym razem napisz sam)

Kiedy juz znajdziesz wlasciwe znaki dojdziesz do kodu:

:004013CC  8BD0                MOV       EDX,EAX
:004013CE  83C260              ADD       EDX,60
:004013D1  33C9                XOR       ECX,ECX
:004013D3  33F6                XOR       ESI,ESI
:004013D5  8A08                MOV       CL,[EAX]
:004013D7  40                  INC       EAX
:004013D8  014A04              ADD       [EDX+04],ECX
:004013DB  300A                XOR       [EDX],CL
:004013DD  46                  INC       ESI
:004013DE  803800              CMP       BYTE PTR [EAX],00
:004013E1  75F2                JNZ       004013D5
:004013E3  56                  PUSH      ESI
:004013E4  0132                ADD       [EDX],ESI
:004013E6  8A0A                MOV       CL,[EDX]
:004013E8  2BC6                SUB       EAX,ESI
:004013EA  83E804              SUB       EAX,04
:004013ED  50                  PUSH      EAX
:004013EE  BE04000000          MOV       ESI,00000004
:004013F3  3008                XOR       [EAX],CL
:004013F5  40                  INC       EAX
:004013F6  4E                  DEC       ESI
:004013F7  E0FA                LOOPNZ    004013F3
:004013F9  5F                  POP       EDI
:004013FA  8B4204              MOV       EAX,[EDX+04]
:004013FD  59                  POP       ECX
:004013FE  D3E0                SHL       EAX,CL
:00401400  0582190639          ADD       EAX,39061982
:00401405  2B07                SUB       EAX,[EDI]
:00401407  755D                JNZ       00401466        ; w wyniku musi dac 0

Jest to obliczanie 4-bajtowej "sumy kontrolnej" dalszego tekstu, ktory jest
imieniem zakodowanym w taki sposob, ze zamiast znaku piszemy znak o kodzie
rownym 0x100 - kod litery. Rowniez tej procedury nie mozna odwrocic. Oto
moj program BRUTE-FORCE:

;------------------------------- tu ciac -----------------------------------
.386
.code
org 100h

start:

inc dword ptr [number]
jz exit
mov eax, [number]
mov [guess], eax

xor byte ptr [guess],   6Eh
xor byte ptr [guess+1], 6Dh
xor byte ptr [guess+2], 6Ch
xor byte ptr [guess+3], 6Bh

mov eax, 07F8h             ; to jest stala dla mojej ksywki wyliczona przez program
                           ; i podejrzana SoftICE'em
shl eax, 0Ch               ; liczba znakow w "noname/AAOCG"
add eax, 39061982h         ; druga stala
sub eax, [guess]

jnz start

exit:
lea eax, number
int 3
ret

number DD '0000'
guess  DD 0
end start
;------------------------------- tu ciac -----------------------------------

Pamietaj o uruchomieniu SoftICE'a i wlaczeniu I3HERE. Ten program mozna udosko-
nalic tak, ze w kilka sekund znajdzie numer, ale przeciez to ma byc tylko ilu-
stracja zagadnienia...


5. KONIEC

Dobra, to tyle - teraz mozesz sie przylaczyc do CookieCrk!

                                                                (c) noname/AAOCG
                                                                   <76381@polbox.com>
